#include<iostream>
#include<bits/stdc++.h>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;
//pthread_self：获取线程id
//本质上获取的是pthread库映射到当前进程的地址空间的描述该线程相关信息的共享区起始地址
//主线程使用的是进程地址空间当中原生的栈，其余线程使用的栈在共享库当中开辟
//对线程的描述和管理在线程库当中进行
//在线程库当中为每个线程分配一块区域：包含strcut pthread:描述该线程的数据结构 线程局部存储  线程栈

// pthread_t main_id;
// void* Run(void* arg)
// {
//     //pthread_detach(pthread_self());
//     char* msg = (char*)arg;
//     printf("例程函数参数为:%s\n",msg);
//     printf("I am running.....%lu\n",pthread_self());
//     // return (void*)"1111";
//     // pthread_cancel(pthread_self());
//     // printf("you can see me!\n");
//     pthread_exit((void*)"1111");
// }
// int main()
// {
//     main_id = pthread_self();
//     pthread_t tid;
//     pthread_create(&tid,NULL,Run,(void*)"thread 1");
//     void* val = NULL;
//     pthread_join(tid,&val);
//     printf("%s\n",(char*)val);
//     return 0;
// }


//创建多线程 ->一个进程中有多个线程
//多进程:程序运行起来后有多个进程
void* Routine(void* arg)
{
    char* msg = (char*)arg;
    int count = 3;
    while(count--)
    {
        printf("I am thread %s, tid:%lu\n",msg,pthread_self());
        sleep(1);
    }
    pthread_exit((void*)"1111");
}
#define NUM 5
int main()
{
    pthread_t tid[NUM];//保存线程id
    for(int i = 0;i<NUM;i++)
    {
        char* buf = new char[64];
        sprintf(buf,"thread %d","i");
        pthread_create(&tid[i],NULL,Routine,(void*)buf);
    } 
    printf("I am main pthread!!!!!!!!!! tid:%lu\n",pthread_self());

    //线程等待
    for(int i = 0;i<NUM;i++)
    {
        void* ret = NULL;
        pthread_join(tid[i],&ret);
        printf("thread:%lu  quit  exitcode:%s\n",tid[i],(char*)ret);
    }
    return 0;
}
